/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-09-03     miaoju       the first version
 */
#include <rtthread.h>
#include <string.h>
#include "fkmaster.h"
#include <rtdevice.h>
#include <board.h>
#include <drv_lcd.h>

#define DBG_TAG                        "DartSenor"
#define DBG_LVL                        DBG_LOG
#include <rtdbg.h>
#define uart_name "uart2"
#define MASTER_THREAD_STACK_SIZE          1024
#define MASTER_THREAD_PRIORITY            (RT_THREAD_PRIORITY_MAX/2)
#define M2SLEN  9
static rt_uint16_t DARTDATA=0;
/* 串 口 接 收 消 息 结 构*/
struct rx_msg
{
rt_device_t dev;
rt_size_t size;
};
static  rt_device_t serial;//数据发送设备
static  rt_mq_t rx_mq;//消息队列控制块



/**
 * Receive callback function
 */
static rt_err_t uart_input(rt_device_t dev,rt_size_t size)
{
    struct rx_msg msg;
    rt_err_t result;
    msg.dev = dev;
    msg.size = size;
    result = rt_mq_send(rx_mq, &msg, sizeof(msg));
    if ( result == -RT_EFULL) {
    /* 消 息 队 列 满 */
    LOG_E("message queue full！\n");
    }
    return result;
}
/* 帧检验 */
static rt_err_t check_frame(const char *buf,rt_uint8_t size)
{
    rt_uint8_t sum = 0,i;
    if (size !=M2SLEN)
    	{
		LOG_E("Check LEN Err,size %d",size);
        return -RT_ERROR;
    	}
    if (buf[0] !=0xff)
		{
		LOG_E("Check Head Err");
        return -RT_ERROR;
	    }
    for (i = 1; i < (size - 1); i++)
        {
        sum += buf[i];
	    }
	sum = (~sum) + 1;
    if (sum != buf[size-1])
    {
        LOG_E("Checksum incorrect (%04x != %04x)", sum, buf[size-1]);
        return -RT_ERROR;
    }
	else
    {
       DARTDATA=buf[4]<<8|buf[5];
	   LOG_I("recv OK%d/r/n",DARTDATA);//校验正确提取数据
	   DARTDATA=DARTDATA*1.23;
	    /* 清屏 */
	   lcd_clear(BLACK);
	   lcd_show_num(40, 100, DARTDATA,16,32);
	   return RT_EOK;
	}
}
static void rx_thread_entry(void *parameter)
{
    struct rx_msg msg;
    rt_err_t result;
    char rx_buffer[M2SLEN];
    while (1)
    {
        rt_memset(&msg, 0, sizeof(msg));
        /* 从 消 息 队 列 中 读 取 消 息*/
        result = rt_mq_recv(rx_mq, &msg, sizeof(msg), RT_WAITING_FOREVER);
        if (result == RT_EOK)
        {
            /* 从 串 口 读 取 数 据*/
            rt_device_read(msg.dev, 0, rx_buffer, msg.size);
            check_frame((const char*)rx_buffer, msg.size);
            /* 处理收到的正确 数 据*/
        }

    }
}
static int uart_master(void)
{
    /* 查 找 系 统 中 的 串 口 设 备 */
    serial = rt_device_find(uart_name);
    if (!serial)
       {
            LOG_E("find %s failed!\n", uart_name);
            return RT_ERROR;
       }
    struct serial_configure config = RT_SERIAL_CONFIG_DEFAULT;

    config.baud_rate = BAUD_RATE_9600;
    config.data_bits = DATA_BITS_8;
    config.stop_bits = STOP_BITS_1;
    config.bufsz = RT_SERIAL_RB_BUFSZ;
    config.parity = PARITY_NONE;

    rt_device_control(serial, RT_DEVICE_CTRL_CONFIG, &config);
	
    rx_mq  = rt_mq_create( "master_rx_mq", sizeof(struct rx_msg), /* 一 条 消 息 的 最 大 长 度 */
                                              256, /* 存 放 消 息 的 缓 冲 区 大 小 */
                                              RT_IPC_FLAG_FIFO); /* 如 果 有 多 个 线 程 等 待， 按 照 先 来 先 得 到 的 方 法*/
    /* 以 DMA 接 收  方 式 打 开 串 口 设 备 */
    rt_device_open(serial, RT_DEVICE_FLAG_DMA_RX);
    /* 设 置 接 收 回 调 函 数 */
    rt_device_set_rx_indicate(serial, uart_input);
    /* 创 建 并启动master_rx 线 程 */
    rt_thread_t master_rx = rt_thread_create("master_rx", rx_thread_entry, RT_NULL,
            MASTER_THREAD_STACK_SIZE, MASTER_THREAD_PRIORITY, 10);
    /* 创 建 成 功 则 启 动 线 程 */
    if (master_rx != RT_NULL) {
    rt_thread_startup(master_rx);
    }
    else
    {
        return  RT_ERROR;
    }
    return  RT_EOK;
 }
/* 导 出 APP 列 表 中 */
INIT_APP_EXPORT(uart_master);
